import axios, {AxiosResponse, AxiosError, AxiosRequestConfig} from "axios"
import {store} from "../store"
import {clearToken} from "../store/user/userSlice"
import {navigationRef} from "./navigation"

// 创建axios实例
const instance = axios.create({
  baseURL: "http://api-tanhua-harmony.itheima.net", // 替换为你的API基地址
  timeout: 10000,
  headers: {
    "Content-Type": "application/json",
  },
})

// 请求拦截器
instance.interceptors.request.use(
  async config => {
    // 在发送请求之前做些什么
    // 例如：添加token
    const token = store.getState().user.token
    config.headers.Authorization = `Bearer ${token}`
    return config
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 响应拦截器
instance.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做点什么
    const res = response.data
    // 根据自己的业务逻辑处理响应
    if (res.code === "10000") {
      return res.data
    }
    return Promise.reject(res)
  },
  (error: AxiosError) => {
    // 对响应错误做点什么
    if (error.response) {
      // 根据不同的HTTP状态码处理错误
      switch (error.response.status) {
        case 401:
          // 未授权，可能需要重新登录
          console.error("未授权，请重新登录")
          store.dispatch(clearToken())
          navigationRef.navigate("Login")
          break
        case 403:
          // 拒绝访问
          console.error("拒绝访问")
          break
        case 404:
          // 请求的资源不存在
          console.error("请求的资源不存在")
          break
        case 500:
          // 服务器错误
          console.error("服务器错误")
          break
        default:
          console.error(`错误状态码: ${error.response.status}`)
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      console.error("网络错误，未收到响应")
    } else {
      // 请求配置有误
      console.error("请求配置错误:", error.message)
    }
    return Promise.reject(error)
  },
)

export class RequestAxios {
  static get<T>(url: string, params?: object) {
    return instance.get<null, T>(url, {params})
  }
  static post<T>(url: string, data?: object, config?: AxiosRequestConfig) {
    return instance.post<null, T>(url, data, config)
  }
  static delete<T>(url: string, params?: object) {
    return instance.delete<null, T>(url, {params})
  }
  static put<T>(url: string, data?: object) {
    return instance.put<null, T>(url, data)
  }
}
